﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using System.Collections.Generic;
using NoeticTools.NWorkflow.Scopes;


namespace NoeticTools.NWorkflow.Tests.Examples
{
    public class WorkflowRulesC : SampleWorkflowRulesBase
    {
        public WorkflowRulesC(IList<string> eventsLog)
            : base("Sample", eventsLog)
        {
        }

        protected override void BuildWorkflow()
        {
            base.BuildWorkflow();

            OnBegin
                .Ensure(() => PrerequisiteCheck() == false).Then
                .EnterStep("Step A");

            using (var x = AddStep<Result>("Step A"))
            {
                x.OnEntry.InvokeFunction(StepMethodA_Completed);
                x.OnEntry.Invoke(InvokeMethodA).Then.Invoke(InvokeMethodB, "B").Then.Invoke(InvokeMethodC, 3, "C");
                x.OnResult(Result.Completed).Invoke(InvokeMethodC, 4, "Result = completed");
                x.OnAnyUnhandledResult.Exit(Result.Completed);
                x.OnLeaving.Invoke(InvokeMethodC, 4, "Leaving");
            }

            using (var x = AddStep<Result>("Step B"))
            {
                x.OnEntry.Invoke(InvokeMethodB, "Step").Then.Exit(Result.Completed);
            }
        }

        private bool PrerequisiteCheck()
        {
            return true;
        }

        private void InvokeMethodA()
        {
            _eventsLog.Add("InvokeMethodA");
        }

        private void InvokeMethodB(string arg)
        {
            _eventsLog.Add(string.Format("InvokeMethodB({0})", arg));
        }

        private void InvokeMethodC(int arg1, string arg2)
        {
            _eventsLog.Add(string.Format("InvokeMethodC({0}, {1})", arg1, arg2));
        }
    }
}